package com.treeroot.queue;

/**
 * 数组实现的队列
 */
public class ArrayQueueByGPT {
    /**
     * 最大容量
     */
    private final int maxSize;
    /**
     * 队列头的数据的前一个数据
     */
    private int front;
    /**
     * 队列尾
     */
    private int rear;
    /**
     * 该数组用于存放数据，模拟队列
     */
    private final int[] arr;

    /**
     * 创建队列的构造器
     *
     * @param maxSize 队列最大容量
     */
    public ArrayQueueByGPT(int maxSize) {
        this.maxSize = maxSize;
        this.arr = new int[maxSize];
        //指向队列头部,指出front是指向队列头的数据的前一个数据
        this.front = -1;
        //指向队列尾部,指向队列尾的数据（即就是队列的最后一个数据）
        this.rear = -1;
    }

    /**
     * 判断队列是否已满
     *
     * @return 如果队列已满则返回true，否则返回false
     */
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    /**
     * 判断队列是否为空
     *
     * @return 如果队列为空则返回true，否则返回false
     */
    public boolean isEmpty() {
        return rear == front;
    }

    /**
     * 添加数据到队列
     *
     * @param data 待添加的数据
     * @throws RuntimeException 如果队列已满，则抛出异常
     */
    public void add(int data) {
        if (isFull()) {
            System.out.println("队列已满，无法添加数据");
            throw new RuntimeException("队列已满，无法添加数据");
        } else {
            //将rear后移，并添加新的数据
            rear++;
            arr[rear] = data;
        }
    }

    /**
     * 获取队列头部数据
     *
     * @return 队列头部数据，若队列为空则返回-1
     * @throws RuntimeException 如果队列为空，则抛出异常
     */
    public int get() {
        if (isEmpty()) {
            System.out.println("队列为空，无法获取数据");
            throw new RuntimeException("队列为空，无法获取数据");
        } else {
            //将front后移，并返回对应的数据
            front++;
            return arr[front];
        }
    }

    /**
     * 显示所有数据
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("队列为空，没有数据");
        } else {
            for (int i = front + 1; i <= rear; i++) {
                System.out.printf("arr[%d]=%d\n", i, arr[i]);
            }
        }
    }

    /**
     * 显示队列头部数据
     *
     * @return 队列头部数据，若队列为空则返回-1
     * @throws RuntimeException 如果队列为空，则抛出异常
     */
    public int head() {
        if (isEmpty()) {
            System.out.println("队列为空，无法获取头部数据");
            throw new RuntimeException("队列为空，无法获取头部数据");
        }
        return arr[front + 1];
    }
}
